#include "stdafx.h"
#include "Win32Exception.h"
#include <boost/algorithm/string.hpp>

using namespace std;
using namespace boost::algorithm;
using namespace ISAPI_Python::Win32Helpers;

Win32Exception::Win32Exception() :
  Win32ErrorCode( GetLastError() ),
  ErrorMessage( GetErrorMessage(Win32ErrorCode) ) {
}

Win32Exception::Win32Exception(const DWORD errorCode) :
  Win32ErrorCode(errorCode),
  ErrorMessage( GetErrorMessage(errorCode) ) {
}

Win32Exception::Win32Exception(const ISAPI_Python::Win32Helpers::Win32Exception &otherWin32Exception) :
  exception(otherWin32Exception),
  Win32ErrorCode( otherWin32Exception.Win32ErrorCode ),
  ErrorMessage( otherWin32Exception.ErrorMessage ) {
}

const string Win32Exception::GetErrorMessage(const DWORD errorCode) const {
	PVOID systemErrorMessage = NULL;

	DWORD length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, errorCode,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&systemErrorMessage, 0, NULL);

	string output((LPSTR)systemErrorMessage, length);
	replace_last(output, "\r\n", "");

	LocalFree(systemErrorMessage);

	return output;
}

Win32Exception::~Win32Exception() {
}

const char* Win32Exception::what() const{
	return ErrorMessage.c_str();
}

const DWORD Win32Exception::ErrorCode() const {
	return Win32ErrorCode;
}